package com.javacoo.xservice.base.exception;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import com.javacoo.xservice.base.BaseResponse;
import com.javacoo.xservice.base.support.HttpCode;

/**
 * 异常基类
 * <p>说明:</p>
 * <li></li>
 * @author DuanYong
 * @since 2017年6月6日上午8:44:21
 */
@SuppressWarnings("serial")
public abstract class BaseException extends RuntimeException {
	/**错误码*/
	protected String code;
	public BaseException() {
	}

	public BaseException(Throwable ex) {
		super(ex);
	}
	public BaseException(String message) {
		super(message);
	}
	public BaseException(String code,String message) {
		super(message);
		this.code = code;
	}
	public BaseException(String message, Throwable ex) {
		super(message, ex);
	}
	public String getCode() {
		return code;
	}

	public void handler(BaseResponse baseResponse) {
		if (StringUtils.isNotBlank(getCode())) {
			baseResponse.setCode(getCode());
		} else {
			baseResponse.setCode(String.valueOf(getHttpCode().value()));
		}
		if (StringUtils.isNotBlank(getMessage())) {
			baseResponse.setMessage(getMessage());
		} else {
			baseResponse.setMessage(getHttpCode().msg());
		}
		baseResponse.setTimestamp(System.currentTimeMillis());
	}
    /**
     * 获取状态
     * <p>说明:</p>
     * <li></li>
     * @author DuanYong
     * @return
     * @since 2017年6月6日上午8:52:59
     */
	protected abstract HttpCode getHttpCode();

    /**
     * 格式化文本
     * <li></li>
     * @author DuanYong
     * @date 2018/6/5 14:03
     * @param template: 文本模板，被替换的部分用 {} 表示
     * @param values: 参数值
     * @return: java.lang.String 格式化后的文本
     */
    protected static String format(String template, Object... values) {
        if (ArrayUtils.isEmpty(values)) {
            return template;
        }
        // 由于String.format针对于%有特殊处理，所以需要转义下
        String replacedTemplate = template.replace("%", "%%");
        return StringUtils.isBlank(template) ? StringUtils.EMPTY : String.format(replacedTemplate.replace("{}", "%s"),
            values);
    }
}
